const express = require("express");
const app = express(); // 创建服务器的实例对象

const joi = require("joi"); // 导入定义验证规则的包

const cors = require("cors");
app.use(cors()); //配置跨域，必须在路由之前

// const bodyParser = require("body-parser");
app.use(express.json()); //配置解析，用于解析json和urlencoded格式的数据
// app.use(bodyParser.urlencoded({ extended: false }));

app.use(express.urlencoded({ extended: false })); // 配置解析表单数据的中间件，注意：这个中间件，只能解析 application/x-www-from-urlencoded 格式的表单数据

const { expressjwt } = require("express-jwt"); // 解析 token 的中间件
const config = require("./config"); // 导入token的配置文件
app.use(
  expressjwt({ secret: config.jwtSecretKey, algorithms: ["HS256"] }).unless({
    path: [/^\/user/, /^\//, /^\/imgs/, /^\/worker/],
  })
); // path 指定哪些接口不需要进行token认证  /^\/page/,

let userRouter = require("./router/user.js");
app.use("/user", userRouter); //配置用户路由

let workerRouter = require("./router/worker.js");
app.use("/worker", workerRouter); //配置管理员路由

let goodsRouter = require("./router/goods.js");
app.use("/goods", goodsRouter); //配置商品路由

let pageRouter = require("./router/page.js");
app.use("/page", pageRouter); //配置页面路由

let shoppingRouter = require("./router/shopping.js");
app.use("/shopping", shoppingRouter); //配置页面路由

// 定义错误级别的中间件
app.use((err, req, res, next) => {
  console.log(err);
  if (err.status == 401) {
    return res.send({ code: 401, message: "token过期" });
  }
  if (err.name === "UnauthorizedError") return res.send("身份认证失败"); // token 身份认证失败返回
  res.send({ code: 500, message: "未知错误", err }); // 未知的错误
});

app.use("/imgs", express.static("./images")); // 图片链接

app.listen(80, () => {
  console.log("服务器启动成功");
});
